// 函子控制函数式编程的副作用，用来控制在可控的范围内、异常处理、异步操作
//容器：包含值和值的变形关系(这个变形关系就是函数)
//函子：是一个特殊的容器，通过一个普通的对象来实现，该对象具有 map 方法，map 方法接受一个参数(函数)，对值处理的函数（可以行一个函数对值进行处理(变形关系)）

//简义：一个值包裹在一个盒子不对外公布，如果想对值处理的话，就对外的处理值的函数：map方法，

// 一个容器，包裹一个值
// class Container {
//     constructor (value) {
//         // 私有成员
//         this._value = value
//     }
//     //对外提供一个map方法，处理接受处理值的函数，处理的结果给一个新的函子返回一个新的函数
//     //// map 方法，传入变形关系，将容器里的每一个值映射到另一个容器
//     map(fn) {
//         return new Container(fn(this._value))
//     }
// }

// let r = new Container(5).map(x => x + 1).map(x => x * x)

// console.log(r)


//优化，避免出现new 关键字创建对象
class Container {
    // of 静态方法，可以省略 new 关键字创建对象
    static of (value) {
        return new Container(value)
    }
    constructor (value) {
        // 私有成员
        this._value = value
    }
    //对外提供一个map方法，处理接受处理值的函数，处理的结果给一个新的函子返回一个新的函数
    //// map 方法，传入变形关系，将容器里的每一个值映射到另一个容器
    map(fn) {
        return Container.of(fn(this._value))
    }
}
let r = Container.of(5).map(x => x + 2).map(x => x * x)
console.log(r)

